/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.seguridad.web;

import com.isd.facturacion.modelo.ItemProductoTienda;
import com.isd.facturacion.web.CarritoBean;
import com.isd.global.util.JsfUtil;
import com.isd.inventario.modelo.Producto;
import com.isd.inventario.rn.ProductoRN;
import com.isd.inventario.vista.ItemCatalogo;
import com.isd.seguridad.modelo.ProductoFavorito;
import com.isd.seguridad.rn.UsuarioRN;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author Claudio
 */
@ManagedBean
@ViewScoped
public class FavoritosBean implements Serializable{
    
    @EJB private UsuarioRN usuarioRN; 
    @EJB private ProductoRN productoRN; 
    
    @ManagedProperty(value = "#{usuarioSessionBean}")
    private UsuarioSessionBean usuarioSessionBean;
    
    @ManagedProperty(value = "#{carritoBean}")
    private CarritoBean carritoBean;
    
    private static final Logger LOG = Logger.getLogger(FavoritosBean.class.getName());
    
    /**
     * Creates a new instance of FavoritosBean
     */
    public FavoritosBean() {
        
    }
    
    @PostConstruct
    public void init(){
        
        if(usuarioSessionBean.isEstaRegistrado()){            
            
        }else{
            JsfUtil.addErrorMessage("Debe estar registrado para visualizar estos datos");            
        }
    }
    
    private void agregarFavoritoFromProducto(Producto p){
        
        ProductoFavorito favorito = new ProductoFavorito();
        favorito.setUsuari(usuarioSessionBean.getUsuario().getNombre());
        favorito.setTippro(p.getTippro());
        favorito.setArtcod(p.getArtcod());
        favorito.setProducto(p);
        favorito.setUsuario(usuarioSessionBean.getUsuario());
        
        if(usuarioSessionBean.getUsuario().getFavoritos().contains(favorito)){
            JsfUtil.addWarningMessage("El producto ya se encuentra entre los favoritos");
            return;
        }        
        usuarioSessionBean.getUsuario().getFavoritos().add(favorito);
        
        try {
            usuarioRN.guardarFavorito(favorito);            
            JsfUtil.addInfoMessage("El producto se ha agregado correctamente de favoritos");       
        } catch (Exception ex) {
            Logger.getLogger(FavoritosBean.class.getName()).log(Level.SEVERE, "agregarFavoritoFromProducto", ex);
            usuarioSessionBean.getUsuario().getFavoritos().remove(favorito);    
            JsfUtil.addErrorMessage("No es posible agregar el producto a favoritos en estos momentos");
        }
        
        marcarCompradoEnFavorito();
        
    }
    
    public void agregarFavorito(ItemCatalogo item){
        
        item.setProducto(productoRN.getProducto(item.getTippro(),item.getArtcod()));
        agregarFavoritoFromProducto(item.getProducto());        
        item.setFavorito(true);
    }
    
    public void eliminarFavorito(ItemCatalogo item){
        
        item.setProducto(productoRN.getProducto(item.getTippro(),item.getArtcod()));        
        item.setFavorito(!eliminarFavoritoFromProducto(item.getProducto()));
    }
        
    public boolean eliminarFavoritoFromProducto(Producto p){
        
        try {
            ProductoFavorito favoritoAux = new ProductoFavorito();            
            favoritoAux.setUsuari(usuarioSessionBean.getUsuario().getNombre());
            favoritoAux.setTippro(p.getTippro());
            favoritoAux.setArtcod(p.getArtcod());
            
            usuarioRN.eliminarFavorito(favoritoAux);
            
            if (usuarioSessionBean.getUsuario().getFavoritos().contains(favoritoAux)) {
                usuarioSessionBean.getUsuario().getFavoritos().remove(favoritoAux);                
                JsfUtil.addWarningMessage("El producto se ha eliminado correctamente de favoritos");
                return true;
            } else {
                JsfUtil.addWarningMessage("No se encontró producto favoritoa  eliminar");
                return false;
            }                        
            
        } catch (Exception e) {
            JsfUtil.addWarningMessage("No es posible eliminar el producto de favoritos en este momento");
            LOG.log(Level.SEVERE, e.getMessage());
            return false;
        }
    }
    
    
    public void marcarCompradoEnFavorito(){

        if (usuarioSessionBean.getUsuario().getFavoritos()==null) return;
        if (carritoBean.getCarrito()==null) return;
        if (carritoBean.getCarrito().getItemsProducto()==null) return;

        List<ProductoFavorito> favoritos = usuarioSessionBean.getUsuario().getFavoritos();
        List<ItemProductoTienda> items = carritoBean.getCarrito().getItemsProducto();
        
        int cantItems = favoritos.size();
        int contadorItemsCarrito = 0;
        

        for(ProductoFavorito iFav: favoritos){
            iFav.setSeleccionado(false);
                        
            //Seleccionados en el carrito
            for(ItemProductoTienda item: items){
                if(item.getProducto()!=null){
                    if(iFav.getTippro().equals(item.getProducto().getTippro()) &&
                       iFav.getArtcod().equals(item.getProducto().getArtcod())){

                        iFav.setSeleccionado(true);
                        contadorItemsCarrito++;
                        if(contadorItemsCarrito==cantItems) return;
                    }
                }
            }
           
        }
    }
    
    
    public UsuarioSessionBean getUsuarioSessionBean() {
        return usuarioSessionBean;
    }

    public void setUsuarioSessionBean(UsuarioSessionBean usuarioSessionBean) {
        this.usuarioSessionBean = usuarioSessionBean;
    }

    public CarritoBean getCarritoBean() {
        return carritoBean;
    }

    public void setCarritoBean(CarritoBean carritoBean) {
        this.carritoBean = carritoBean;
    }
    
    
}
